package com.joker.aigc.chat.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.joker.aigc.chat.domain.dto.MessageDto;
import com.joker.aigc.chat.domain.dto.MessageMemberDto;
import com.joker.aigc.chat.domain.dto.MessageQueryCriteria;
import com.joker.aigc.chat.domain.dto.MessageReadDto;
import com.joker.aigc.chat.domain.dto.MessageReadInfoCriteria;
import com.joker.aigc.chat.domain.dto.MessageRecallDto;
import com.joker.aigc.chat.domain.entity.Message;
import com.baomidou.mybatisplus.extension.service.IService;
import com.joker.aigc.chat.domain.vo.MessageReadInfoVo;
import com.joker.aigc.chat.domain.vo.MessageReadVo;
import com.joker.aigc.chat.domain.vo.MessageVo;

import java.util.Date;
import java.util.List;

/**
 * @author 20346
 * @description 针对表【message(消息表)】的数据库操作Service
 * @createDate 2023-12-17 11:26:08
 */
public interface MessageService extends IService<Message> {

    /**
     * 发送消息
     *
     * @param request 消息内容
     * @param uid     发送的id
     * @return 消息存储在数据中的id
     */
    MessageVo sendMsg(MessageDto request, Long uid);
    // 处理消息的类

    /**
     * 获取某一条消息
     *
     * @param msgId 消息id
     * @return 具体的消息内容
     */
    MessageVo queryMessageById(Long msgId);

    /**
     * 批量查询某一个房间里的所有消息
     *
     * @param criteria 查询条件
     * @return 批量消息的内容
     */
    Page<MessageVo> queryMessage(MessageQueryCriteria criteria);

    /**
     * 撤回消息内容
     *
     * @param recallDto 撤回消息的id和房间号
     */
    void recallMsg(MessageRecallDto recallDto);


    /**
     * 获取消息的已读未读列表
     *
     * @param messageReadDto 获取消息的已读未读列表
     * @return 返回未读消息
     */
    Page<MessageReadVo> getReadPage(Long uid, MessageReadDto messageReadDto);

    /**
     * 获取消息的已读未读总数
     *
     * @param request 查询信息
     * @return 返回消息的已读未读总数
     */
    List<MessageReadInfoVo> getReadInfo(Long uid, MessageReadInfoCriteria request);

    /**
     * 消息阅读上报
     *
     * @param uid              用户uid
     * @param messageMemberDto
     */
    void msgRead(Long uid, MessageMemberDto messageMemberDto);

    boolean riseOptimistic(Long id, Integer oldType, Integer newType);

    Integer getGapCount(Long roomId, Long fromId, Long toId);

    void invalidByUid(Long uid);

    Integer getUnReadCount(Long roomId, Date readTime);

    Boolean removeByRoomId(Long roomId, List<Long> uidList);

}
